package main

import (
	"bufio"
	"fmt"
	"game/src/common/impl"
	"game/src/conf"
	"io"
	"net"
	"os"
	"strconv"
	"strings"
)

/*
	模拟客户端
*/

var conn net.Conn
var opMap map[string]uint32

func main() {

	fmt.Println("Client Test ... start")
	var err error
	conn, err = net.Dial("tcp", "127.0.0.1:7777")
	if err != nil {
		fmt.Println("client start err, exit!")
		return
	}
	conf.InitConfig()
	initOpMap()
	go acceptMsg()
	name := ""

	op := ""
	for {
		//发封包message消息
		if name == "" {
			fmt.Println("未登录，请输入你的姓名以登录游戏 ：")
			reader := bufio.NewReader(os.Stdin) // 标准输入输出
			name, _ = reader.ReadString('\n')   // 回车结束
			name = strings.TrimSpace(name)      // 去除最后一个空格
			fmt.Printf(name)
			if name == "" {
				continue
			}
			sendMsg(1, name)
		} else {
			reader := bufio.NewReader(os.Stdin) // 标准输入输出
			op, _ = reader.ReadString('\n')     // 回车结束
			op = strings.TrimSpace(op)          // 去除最后一个空格
			fmt.Printf(op)
			if op == "" {
				continue
			}
			arr := strings.Fields(op)
			if u, ok := opMap[arr[0]]; ok {
				sendMsg(u, op)
			} else {
				// 快速命令
				itemId64, err := strconv.ParseInt(arr[0], 10, 32)
				if err != nil {
					return
				}
				itemId32 := uint32(itemId64)
				sendMsg(itemId32, op)
			}

		}
	}

}

func initOpMap() {
	opMap = make(map[string]uint32)
	//opMap["/login"] = 1   //注释掉  关闭登录命令，防止一个连接多次的登录不同名字，
	opMap["/createAlliance"] = 11  // /createAlliance allianceName
	opMap["/whichAlliance"] = 12   // 登录后的玩家可以查看自己所属的公会 若有公会则返回公会名字 成员列表
	opMap["/allianceList"] = 13    //查询所有的公会命令
	opMap["/joinAlliance"] = 14    // /joinAlliance name  加入公会命令
	opMap["/dismissAlliance"] = 15 // 解散公会

	opMap["/increaseCapacity"] = 21 // 仓库容量上限为30，可扩容一次，扩容长度为10，只有会长可以扩容
	opMap["/storeItem"] = 22        // /storeItem itemId itemNum index
	opMap["/destroyItem"] = 23      // /destroyItem index
	opMap["/clearup"] = 24          // 整理仓库

}

func sendMsg(msgId uint32, param string) {
	//发封包message消息
	dp := impl.NewDataPack()
	msg, _ := dp.Pack(impl.NewMsgPackage(msgId, []byte(param)))
	_, err := conn.Write(msg)
	if err != nil {
		fmt.Println("write error err ", err)
	}
}

func acceptMsg() {
	dp := impl.NewDataPack()
	for {
		//先读出流中的head部分
		headData := make([]byte, dp.GetHeadLen())
		_, err := io.ReadFull(conn, headData) //ReadFull 会把msg填充满为止
		if err != nil {
			fmt.Println("read head error")
			break
		}
		//将headData字节流 拆包到msg中
		msgHead, err := dp.Unpack(headData)
		if err != nil {
			fmt.Println("server unpack err:", err)
			return
		}

		if msgHead.GetDataLen() > 0 {
			//msg 是有data数据的，需要再次读取data数据
			msg := msgHead.(*impl.Message)
			msg.Data = make([]byte, msg.GetDataLen())

			//根据dataLen从io中读取字节流
			_, err := io.ReadFull(conn, msg.Data)
			if err != nil {
				fmt.Println("server unpack data err:", err)
				return
			}
			fmt.Println(string(msg.Data))
		}

	}
}
